/**
 * 
 */
package com.furb.pub.persistencia;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.furb.pub.config.Configuracao;
import com.furb.pub.config.EnPropriedade;
import com.furb.pub.controle.sistema.Setor;

/**
 * @author Fernando
 * 
 */
public class SetorDao implements IDao<Setor> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    protected static final String PASTA_SETORES = Configuracao.get(EnPropriedade.PASTA_SETORES.getChave());

    /*
     * (non-Javadoc)
     * 
     * @see dados.IDao#alterar(java.lang.Object)
     */
    @Override
    public boolean alterar(Setor obj) {

        Setor setor = find(obj.getNome());

        excluir(setor);

        return inserir(obj);

    }

    /*
     * (non-Javadoc)
     * @see com.furb.pub.persistencia.IDao#inserir(java.lang.Object)
     */
    @Override
    public boolean inserir(Setor obj) {

        if (obj == null || obj.getNome() == null) {
            return false;
        }

        if (arquivoJaExiste(obj)) {
            return false;
        }

        try {
            File file = new File(PASTA_SETORES.concat(obj.getNome().concat(EXTENSAO)));

            FileOutputStream setor = new FileOutputStream(file);

            setor.write(obj.toStringDao().getBytes());

            setor.close();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see dados.IDao#excluir(java.lang.Object)
     */
    @Override
    public boolean excluir(Setor obj) {

        File pasta = new File(PASTA_SETORES);

        try {

            String[] arquivos = pasta.list();

            for (String arquivo : arquivos) {

                if (arquivo.equalsIgnoreCase(obj.getNome().concat(EXTENSAO))) {
                    File arq = new File(PASTA_SETORES.concat(obj.getNome().concat(EXTENSAO)));
                    return arq.delete();
                }

            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return false;

    }

    /*
     * (non-Javadoc)
     * 
     * @see dados.IDao#listar()
     */
    @Override
    public List<Setor> listar() {

        List<Setor> setores = new ArrayList<>();

        File pasta = new File(PASTA_SETORES);

        try {

            String[] arquivos = pasta.list();

            for (String arquivo : arquivos) {
                if (!FacadeDao.ehArquivoSistema(arquivo)) {
                    continue;
                }

                Setor setor = getSetorArquivo(arquivo);
                if (setor != null) {
                    setores.add(setor);
                }
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return setores;
    }

    /**
     * @param setores
     * @param arquivo
     * @throws FileNotFoundException
     * @throws IOException
     */
    protected Setor getSetorArquivo(String arquivo) throws FileNotFoundException, IOException {
        BufferedReader buffer = new BufferedReader(new FileReader(PASTA_SETORES.concat(arquivo)));

        try {
            String dadosArquivo = buffer.readLine();

            if (dadosArquivo != null) {

                String[] dadosSetor = dadosArquivo.split("#");

                Setor setor = new Setor(dadosSetor[0]);
                setor.setDescricao(dadosSetor[1]);

                AdapterMesaDao mesaDao = new AdapterMesaDao();

                setor.getMesas().addAll(mesaDao.findMesasForSetor(setor.getNome()));
                return setor;
            }
        } finally {
            buffer.close();
        }
        return null;
    }

    /**
     * Pesquisa o setor pelo seu nom
     * 
     * @param nome do setor
     */
    @Override
    public Setor find(String... params) {

        if (params.length != 1) {
            throw new RuntimeException("Err: Deve ser informado apenas o nome do setor para pesquisa.");
        }

        String nomeSetor = params[0];

        File pasta = new File(PASTA_SETORES);

        try {
            String[] arquivos = pasta.list();

            for (String arquivo : arquivos) {
                if (!FacadeDao.ehArquivoSistema(arquivo)) {
                    continue;
                }

                Setor setor = getSetorArquivo(arquivo);

                if (setor != null && setor.getNome().equalsIgnoreCase(nomeSetor)) {
                    return setor;
                }

            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return null;
    }

    /**
     * @param obj
     * @param pasta
     */
    private boolean arquivoJaExiste(Setor obj) {

        List<Setor> setores = listar();
        for (Setor setor : setores) {
            if (setor.equals(obj)) {
                return true;
            }
        }
        return false;
    }
}
